import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

class User {
    // 当前这俩属性都设置成 public 如果是设为 private 但是同时提供了 getter setter  效果相同
    public int userId;
    public int classId;
}

@WebServlet("/postJson")
public class PostJsonServlet extends HttpServlet {
    // 1. 创建一个 jackson 的核心对象
    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 2. 读取 body 中的请求 然后使用 ObjectMapper 来解析成需要的对象
        // readValue 就是把 JSON 格式的字符串 转成 Java 的对象(主要在这)
        // 第一个参数 表示对哪个字符串进行转换 这个参数可以填写成一个 String 也可以填一个 InputStream 对象 还可以填一个 File
        // 第二个参数 表示要把这个 JSON 格式的字符串 转成哪个 Java 对象
        // req.getInputStream()读到的字符串形如postJson中 {"userId":"123","classId":"456"} 这样的
        // 转换成自己创建的user类
        User user = objectMapper.readValue(req.getInputStream(), User.class);
        resp.getWriter().write("userId: " + user.userId + ", classId: " + user.classId);
    }



//    关于readValue(req.getInputStream(), User.class);
//    源代码是java =>二进制字节码.class =>被加载到内存中就成为了   class 对象(类对象)
//readValue是怎么完成转换的?
//1.先把getInputStream对应的流对象里面的数据都读取出来
//2.针对这个json字符串进行解析，从字符串=>键值对
//key: userld; value: 123
//key: classld; value: 456
//    注意这里的key要和user类中的属性匹配 这样可以获取到 要求名字匹配这是json的默认要求
//    不匹配也是可以的  当要使用映射

//3.遍历这个键值对，依次获取到每一一个key
//根据这个key的名字和User类里面的属性名字对比一下(通过后面的User.class来实现对比  过程是通过反射来实现的) 看有没有匹配的名字!
//如果发现匹配的属性则把当前key对应的value赋值到该User类的属性中(赋值的过程中同时会进行类型转换)
//如果没有匹配的属性就跳过 取下一个key
//4.当把所有的键值对都遍历过之后 此时User对象就被构造的差不多了
}